package io.github.echarts.model.adapter.series;

import io.github.echarts.model.SeriesModel;
import io.github.echarts.model.context.ConfigurationContext;
import io.github.echarts.model.coordinate.CoordinateSystem;
import io.github.echarts.model.coordinate.DataRange;
import io.github.echarts.option.series.PieSeries;
import io.github.echarts.option.series.SeriesOption;

import java.util.Collections;
import java.util.List;

/**
 * 饼图系列适配器
 * <p>
 * 该适配器负责饼图系列的适配工作。
 * </p>
 */
public class PieSeriesAdapter extends AbstractSeriesTypeAdapter {
    
    /**
     * 构造函数
     */
    public PieSeriesAdapter() {
        super("pie");
    }
    
    @Override
    public SeriesModel createModel(SeriesOption seriesOption, String coordinateSystemId, ConfigurationContext context) {
        if (!(seriesOption instanceof PieSeries)) {
            throw new IllegalArgumentException("SeriesOption must be a PieSeries");
        }
        
        final PieSeries pieSeries = (PieSeries) seriesOption;
        
        // 创建简单的SeriesModel实现，实现所有必需的抽象方法
        SeriesModel model = new SeriesModel() {
            private int seriesIndex = 0;
            private CoordinateSystem coordinateSystem = null;
            
            @Override
            public String getType() {
                return "pie";
            }
            
            @Override
            public String getName() {
                return pieSeries.getName();
            }
            
            @Override
            public String getCoordinateSystemId() {
                return coordinateSystemId;
            }
            
            @Override
            public int getSeriesIndex() {
                return seriesIndex;
            }
            
            @Override
            public void setSeriesIndex(int index) {
                this.seriesIndex = index;
            }
            
            @Override
            public List<Object> getData() {
                // 由于getData返回类型与setData参数类型不匹配，需要进行适当的转换
                // 这里返回一个空列表，实际项目中应根据具体需求实现
                return Collections.emptyList();
            }
            
            @Override
            public void processData() {
                // 处理数据，实际项目中应根据具体需求实现
            }
            
            @Override
            public DataRange getDataRange() {
                // 返回数据范围，饼图可能不需要数据范围
                return new DataRange(0, 100); // 默认范围
            }
            
            @Override
            public double[] getDataRangeValues() {
                // 返回数据范围值，饼图可能不需要
                return new double[0];
            }
            
            @Override
            public String getStack() {
                // 饼图不支持堆叠
                return null;
            }
            
            @Override
            public int getZLevel() {
                // 返回默认z-level
                return 0;
            }
            
            @Override
            public CoordinateSystem getCoordinateSystem() {
                return coordinateSystem;
            }
            
            @Override
            public void setCoordinateSystem(CoordinateSystem coordinateSystem) {
                this.coordinateSystem = coordinateSystem;
            }
        };
        
        // 根据数据特性进行优化配置
        optimizePieSeriesConfig(model, pieSeries, context);
        
        return model;
    }
    
    @Override
    public void optimizeVisualStyle(SeriesModel seriesModel, ConfigurationContext context) {
        super.optimizeVisualStyle(seriesModel, context);
        
        // 根据数据特征优化饼图显示效果
        optimizePieVisuals(seriesModel, context);
    }
    
    /**
     * 优化饼图配置
     * 
     * @param model 系列模型
     * @param pieSeries 饼图系列配置
     * @param context 配置上下文
     */
    private void optimizePieSeriesConfig(SeriesModel model, PieSeries pieSeries, ConfigurationContext context) {
        // 根据数据特征优化饼图布局和交互
        ConfigurationContext.DataStatistics stats = context.getDataStatistics();
        int dataCount = stats.getDataPointCount();
        
        // 处理大量数据的饼图
        if (dataCount > 10) {
            // 建议启用图例并限制显示项目数量
            // 注意：SeriesModel可能没有这些方法，仅作示例
            // model.setShowLegend(true);
            // model.setLimitShowNum(8);
        }
        
        // 处理数据项较少的饼图
        if (dataCount <= 3) {
            // 对于数据项较少的饼图，可以增加间隙和标签
            // model.setRoseType(null); // 不使用玫瑰图
            // model.setRadius(["50%", "70%"]); // 环形图更美观
        }
    }
    
    /**
     * 优化饼图视觉效果
     * 
     * @param model 系列模型
     * @param context 配置上下文
     */
    private void optimizePieVisuals(SeriesModel model, ConfigurationContext context) {
        // 获取饼图数据分布信息
        Object distributionStatsObj = context.getInfo("distributionStats");
        if (distributionStatsObj instanceof java.util.Map) {
            @SuppressWarnings("unchecked")
            java.util.Map<String, Object> distributionStats = (java.util.Map<String, Object>) distributionStatsObj;
            
            // 分析数据分布特点，优化视觉效果
            // 例如，判断是否有主导数据项
            // model.setEmphasisMode("single");
        }
        
        // 检查是否存在异常值
        Object outlierStatsObj = context.getInfo("outlierStats");
        if (outlierStatsObj instanceof java.util.Map) {
            @SuppressWarnings("unchecked")
            java.util.Map<String, Object> outlierStats = (java.util.Map<String, Object>) outlierStatsObj;
            
            if (Boolean.TRUE.equals(outlierStats.get("hasOutliers"))) {
                // 对于有异常值的饼图，可以单独处理这些异常值的样式
                // model.setOutlierStyle("highlight");
            }
        }
    }
    
    @Override
    public DataRangeOptimization getDataRangeOptimization(SeriesModel seriesModel, ConfigurationContext context) {
        // 饼图不需要数据范围优化，因为它展示的是比例而非绝对值
        DataRangeOptimization optimization = new DataRangeOptimization();
        optimization.setStartWithZero(true); // 饼图总是从0开始
        return optimization;
    }
}
